package edu.uoc.tdp.servidor.bbdd.estudiants;

import edu.uoc.tdp.common.EOlympicsException;
import edu.uoc.tdp.bbdd.GestorDiscConnexio;
import edu.uoc.tdp.beans.conexio.Estudiant;
import edu.uoc.tdp.beans.conexio.Usuari;
import edu.uoc.tdp.beans.estudiants.Inscripcio;
import edu.uoc.tdp.beans.proves.EstatProva;
import edu.uoc.tdp.beans.proves.PreguntaResposta;
import edu.uoc.tdp.beans.proves.Prova;
import edu.uoc.tdp.beans.proves.RondaEliminatoria;
import edu.uoc.tdp.beans.proves.RondaFinal;
import edu.uoc.tdp.common.EOlympicsExceptionProva;
import edu.uoc.tdp.common.EOlympicsExceptionRonda;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.sql.Date;
import java.util.List;

/**
 * Classe GestorEstudiants
 * TDP Grup 1X4J
 */
public class GestorEstudiants {
    
    private GestorDiscConnexio gestor;
    private Connection connexio;

    /**
     * Constructor de la classe Gestora
     * Crea un nou gestor de disc.
     */
    public GestorEstudiants() throws EOlympicsException {
        this.gestor = new GestorDiscConnexio();
        this.gestor.obreConnexioBD();
        this.connexio = gestor.getConnexio();
    }

    /**
     * Constructor de la classe Gestora
     * Utilitza el gestor de disc passat com a paràmetre
     * @param gdc connexió a la BD de tipus GestorDiscConnexio
     */
    public GestorEstudiants(GestorDiscConnexio gdc) {
        this.gestor   = gdc;
        this.connexio = gdc.getConnexio();
    }
    
   
     /**
     * Obté les proves que estan en periode d'inscripcio
     * @return List<Prova> 
     * @exception RemoteException
     * @exception EOlympicsException
     */  
   public List<Prova> getProvesInscripcio() throws EOlympicsException{        
        Date avui= new Date(System.currentTimeMillis());        
        String sql="SELECT P.idProva,P.descripcio,P.dataIniInscripcio,P.dataFiInscripcio,P.nombrePlaces,P.estat "
                + "FROM PROVA P "                
                + "WHERE P.dataIniInscripcio<='"+ avui +"' "
                + "AND P.dataFiInscripcio>='"+ avui +"' "
                + "AND P.estat = '"  +EstatProva.INICIAL +"' ";
        
        return getProves(sql);
   }
    
       /**
     * Obté les proves que l'estudiant te pendents de realitzar
     * @return List<Prova> 
     * @param Integer Identificador d'estudiant
     * @exception RemoteException
     * @exception EOlympicsException
     */   
   public List<Prova> getProvesInscrit(Integer pidEstudiant) throws EOlympicsException{               
        String sql="SELECT P.idProva,P.descripcio,P.dataIniInscripcio,P.dataFiInscripcio,P.nombrePlaces,P.estat "  
                +  "FROM PROVA P WHERE P.IDPROVA IN "
                + "(SELECT IDPROVA FROM INSCRIPCIO WHERE IDESTUDIANT = " + pidEstudiant + ") "
                + "AND (P.estat = '"  +EstatProva.CLASSIFICACIOPREVIA + "' "
                + "OR P.estat ='"  +EstatProva.COMPETICIOFINAL +"' "
                + "OR P.estat ='"  +EstatProva.COMPETICIOPREVIA +"') ";
        
        return getProves(sql);
   }
 
     /**
     * Obté les proves que no estan en competicio per un estudiant
     * @return List<Prova> 
     * @param Integer Identificador d'estudiant
     * @exception EOlympicsException
     */    
   public List<Prova> getProvesFinalitzades(Integer pidEstudiant) throws EOlympicsException{               
        String sql="SELECT P.idProva,P.descripcio,P.dataIniInscripcio,P.dataFiInscripcio,P.nombrePlaces,P.estat "  
                +  "FROM PROVA P WHERE P.IDPROVA IN "
                + "(SELECT IDPROVA FROM INSCRIPCIO WHERE IDESTUDIANT = " + pidEstudiant + ") "
                + "AND (P.estat = '"  +EstatProva.CLASSIFICACIOPREVIA + "' "
                + "OR P.estat ='"  +EstatProva.CLASSIFICACIOFINAL +"') ";
        
        return getProves(sql);
   }   
   
     /**
     * Obté totes les proves que no estan tancades o cancel.lades per un estudiant
     * @return List<Prova> 
     * @param Integer Identificador d'estudiant
     * @exception EOlympicsException
     */    
   public List<Prova> getProvesInscritesTotals(Integer pidEstudiant) throws EOlympicsException{               
        String sql="SELECT P.idProva,P.descripcio,P.dataIniInscripcio,P.dataFiInscripcio,P.nombrePlaces,P.estat "  
                +  "FROM PROVA P WHERE P.IDPROVA IN "
                + "(SELECT IDPROVA FROM INSCRIPCIO WHERE IDESTUDIANT = " + pidEstudiant + ") "
                + "AND P.estat<> '"  +EstatProva.TANCADA.getEstat() +"' "
                + "AND P.estat<>'"  +EstatProva.CANCELADA.getEstat() +"' ";
        
        return getProves(sql);
   }

     /**
     * Obté el numero d'inscrits per una prova
     * @return Integer
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     */   
   private Integer getnumInscrits(Integer idprova) throws EOlympicsException{   
       
        Statement st=gestor.creaSentencia();
        Integer sortida = 0;
        
        String sql="SELECT count(*) "
                + "FROM INSCRIPCIO I "                
                + "WHERE I.idProva = " + idprova.toString() ;
        try {
            ResultSet rs=st.executeQuery(sql);
            if(rs.next()){
               sortida = rs.getInt(1);
            } 
        } catch (SQLException sqle){
            treatExceptionSQL(sqle.getMessage());
            
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }                        
        return sortida;
    }
   
    /**
     * Consulta Data Inscripció d'un Estudiant en una Prova
     * @param idprova Identificador de la Prova
     * @param idEstudiant Identificador de l'Estudiant
     * @return Data d'inscripció de l'Estudiant en una Prova
     * @exception EOlympicsException
     */
   public Date getDataInscEstudiant(Integer idprova, Integer idEstudiant) throws EOlympicsException {   
       
        Statement st=gestor.creaSentencia();
        Date sortida = new Date(0);
        
        String sql="SELECT I.dataInscripcio "
                + "FROM INSCRIPCIO I "                
                + "WHERE I.idProva = " + idprova.toString() + " "
                + "AND I.idEstudiant = " + idEstudiant.toString();
        try {
            ResultSet rs=st.executeQuery(sql);
            if(rs.next()){
               sortida = rs.getDate(1);
            } 
        } catch (SQLException sqle){
            treatExceptionSQL(sqle.getMessage());
            
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }                        
        return sortida;
    }

        /**
     * Obté els inscrits en una prova
     * @return List<Inscripcio> 
     * @param Integer Identificador d'estudiant
     * @exception EOlympicsException
     */   
   public List<Inscripcio> getInscrits(Integer idprova) throws EOlympicsException{   
       
        Statement st=gestor.creaSentencia();
        List<Inscripcio> sortida = new ArrayList<Inscripcio>();
        String sql="SELECT I.idProva ,I.idEstudiant ,"
                + "(SELECT Universitat  FROM Estudiant E where E.idestudiant = I.idestudiant),"
                + "dataInscripcio "
                + "FROM INSCRIPCIO I "                
                + "WHERE I.idProva = " + idprova.toString() ;
        try {
            ResultSet rs=st.executeQuery(sql);
            while (rs.next()){
                Usuari usuari = new Usuari();
                Estudiant estudiant = new Estudiant();
                usuari = obtenirUsuari(rs.getInt(2));
                estudiant.setIdUsuari(usuari.getIdUsuari());
                estudiant.setUniversitat(rs.getString(3));
                sortida.add(new Inscripcio(getProva(rs.getInt(1)),estudiant,rs.getDate(4)));
            }
        } catch (SQLException sqle){
            treatExceptionSQL(sqle.getMessage());
            
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }                        
        return sortida;
    }   
 
        /**
     * Executa el sql que retorna un llistat de prova
     * @return List<Prova> 
     * @param String  sql a executar
     * @exception EOlympicsException
     */   
    private List<Prova> getProves(String sql) throws EOlympicsException{
        List <Prova>proves= new ArrayList<Prova>();
        Statement st=gestor.creaSentencia();
        Prova prova;
        RondaEliminatoria rondaeliminatoria;
        RondaFinal rondafinal;
        
        try{
            ResultSet rs=st.executeQuery(sql);
            while (rs.next()){  
                
                rondaeliminatoria = new RondaEliminatoria();
                rondafinal = new RondaFinal();
                
                prova = new Prova(rs.getInt(1),rs.getString(2),rs.getDate(3),rs.getDate(4),rs.getInt(5));
                rondaeliminatoria = getRondaEliminatoria(rs.getInt(1));
                rondafinal = getRondaFinal(rs.getInt(1));
                prova.setRondaEliminatoria(rondaeliminatoria);
                prova.setRondaFinal(rondafinal);
                prova.setNombreInscrits(getnumInscrits(rs.getInt(1)));
                prova.setEstat(EstatProva.valueOf(rs.getString(6)));
                proves.add(prova);
            }
            st.close();
            rs.close();
        }catch (SQLException sqle){
            treatExceptionSQL(sqle.getMessage());
            
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }                        
        return proves;
        
    }

     /**
     * Obte la ronda eliminatoria d'una prova
     * @return RondaEliminatoria
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     */   
    public RondaEliminatoria getRondaEliminatoria(Integer idProva) throws  EOlympicsException{        
       RondaEliminatoria ronda=null;       
        Statement st=gestor.creaSentencia();
        String sql="SELECT R.nombrePreguntes,R.dataIniciRealitzacio,R.dataFiRealitzacio "
                + "FROM RONDA R "                
                + "WHERE R.idProva="+ idProva 
                + " And R.tipusRonda='E'";
        try{
            ResultSet rs=st.executeQuery(sql);
            if (rs.next()){                              
                ronda= new RondaEliminatoria(rs.getInt(1),rs.getDate(2),rs.getDate(3),
                                 getPreguntesRespostesRonda(idProva,"E"));
            }
            st.close();
            rs.close();
        }catch (SQLException sqle){
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        
        return ronda;
    }
      /**
     * Obte la ronda final d'una prova
     * @return RondaFinal
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     */     
    public RondaFinal getRondaFinal(Integer idProva) throws  EOlympicsException{
       RondaFinal ronda=null;       
        Statement st=gestor.creaSentencia();
        String sql="SELECT R.nombrePreguntes,R.dataIniciRealitzacio,R.dataFiRealitzacio "
                + "FROM RONDA R "                
                + "WHERE R.idProva="+ idProva 
                + " And R.tipusRonda='F'";
        try{
            ResultSet rs=st.executeQuery(sql);
            if (rs.next()){                              
                ronda= new RondaFinal(rs.getInt(1),rs.getDate(2),rs.getDate(3),
                                 getPreguntesRespostesRonda(idProva,"F"));
            }
            st.close();
            rs.close();
        }catch (SQLException sqle){
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        
        return ronda;
    }
     /**
     * Accessor de lectura que obté les preguntes i respostes d'una ronda
     * @param idProva               Identificador de la prova
     * @param tipus                 E: Ronda eliminatoria, F: Ronda final
     * @return pr                   Llista de Preguntes i respostes de la ronda
     * @throws EOlympicsExceptionRonda
     * @throws EOlympicsException 
     */
    private List<PreguntaResposta> getPreguntesRespostesRonda(Integer idProva, String tipus) throws EOlympicsExceptionRonda, EOlympicsException{
        List<PreguntaResposta>pr=new ArrayList <PreguntaResposta>();
        Statement st=gestor.creaSentencia();
        String sql="SELECT numPregunta,opcioCorrecta "
                + "FROM RESPOSTACORRECTA "
                + "WHERE idProva="+idProva+" "
                + "AND tipusRonda='"+tipus+"' "
                + "ORDER BY numPregunta";
        try{
            ResultSet rs=st.executeQuery(sql);
            while (rs.next()){
                pr.add(new PreguntaResposta(rs.getInt(1),rs.getString(2)));
            }
        }catch (SQLException sqle){
           treatExceptionSQL(sqle.getMessage());
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return pr;
    }

          /**
     * Recupera les dades d'una prova
     * @return Prova
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     */
   private Prova getProva(Integer idProva) throws EOlympicsException{
        Prova prova = null;
        Statement st=gestor.creaSentencia();
        String sql="SELECT P.idProva,P.descripcio,p.dataIniInscripcio,P.dataFiInscripcio,P.nombrePlaces, P.estat "
                + "FROM PROVA P "                
                + "WHERE P.idProva="+ idProva ;
        try{
            ResultSet rs=st.executeQuery(sql);
            if (rs.next()){                
    
                if(rs.getString(6).equals("null")){
                  prova=(new Prova(rs.getInt(1),rs.getString(2),rs.getDate(3),rs.getDate(4),rs.getInt(5)));
                }
                else{
                    prova=(new Prova(rs.getInt(1),rs.getString(2),rs.getDate(3),rs.getDate(4),rs.getInt(5),EstatProva.valueOf(rs.getString(6))));
                }
                
            }
            st.close();
            rs.close();
        }catch (SQLException sqle){
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        }catch (Exception e){
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        
        return prova;
    }        
 
     /**
     * Obte un usuari a partir del seu id
     * @return Usuari
     * @param Integer Identificador d'usuari
     * @exception EOlympicsException
     */
   public Usuari obtenirUsuari(int IdUsu) throws EOlympicsException {
        Usuari usu = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT idUsuari, pwd, email, " +
                "tipusDocumentId, document, nom, cognom1, cognom2, estatEnSistema " +
                "FROM USUARI " + 
                "WHERE idIntern = " + IdUsu +
                " AND dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                usu = new Usuari(IdUsu, rs.getString(1), rs.getString(2),
                                 rs.getString(3), rs.getString(4),
                                 rs.getString(5), rs.getString(6),
                                 rs.getString(7), rs.getString(8),
                                 rs.getString(9));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return usu;
    }
  
         /**
     * tractament d'excepcions
     * @param Strig sqlerror
     * @exception EOlympicsException,EOlympicsExceptionProva
     */
    private void treatExceptionSQL(String sqle) throws EOlympicsExceptionProva, EOlympicsException{
           if(sqle.contains("pk_prova")) {
               throw new EOlympicsExceptionProva(EOlympicsExceptionProva.ERR_SQL_PK_PROVA);
           }else if(sqle.contains("ck_datainsc")) {
               throw new EOlympicsExceptionProva(EOlympicsExceptionProva.ERR_SQL_CK_PROVA);           
           }
           else{
               System.out.println(sqle);
               throw new EOlympicsException(EOlympicsException.ERR_SQL);
           }
    }

     /**
     * Inserta un usuari a la taula Inscripcio
     * @return boolean
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */
    public boolean inscriure(Integer pidProva, Integer pidEstudiant)  throws EOlympicsExceptionProva, EOlympicsException{
        boolean confirmat=false;  
        
        String sql="INSERT INTO INSCRIPCIO "
                + "(idProva,idEstudiant,dataInscripcio) "
                + "VALUES(?,?,?)";
       try{
           java.util.Date utilDate = new java.util.Date();
           java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
           PreparedStatement ps = gestor.crearPreparedStatement(sql);
           ps.setInt(1, pidProva);
           ps.setInt(2, pidEstudiant);
           ps.setDate(3,sqlDate); 
           
           ps.execute();
           ps.close();                     
           
           confirmat=true;
       }catch(SQLException sqle){
         
           treatExceptionSQL(sqle.getMessage());                            
       }catch (Exception e){
           
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
       }
        
        return confirmat;
    }
 
         /**
     * Obte la resposta que ha donat un estudiant per a una pregunta d'una prova
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @param String Tipus de ronda
     * @param Integer Numero de pregunta
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */
    public String RespostaPregunta(Integer pidProva, String TipusRonda, Integer pidEstudiant, Integer numpregunta)  throws EOlympicsExceptionProva, EOlympicsException, SQLException{
       String pregunta= "";  
       
       String sql="SELECT OPCIOMARCADA FROM RESPOSTAESTUDIANT"
                + " WHERE idProva = " + pidProva 
                + " AND tipusronda = '" + TipusRonda 
                + "' AND idestudiant = " + pidEstudiant 
                + " AND numpregunta = " + numpregunta;
       
       try{
           Statement sentencia = gestor.creaSentencia();
           ResultSet rs = sentencia.executeQuery(sql);
            if (rs.next()) {
               pregunta = rs.getString(1);
            }
            rs.close();
            sentencia.close();
           
       }catch(SQLException sqle){
           
           throw new SQLException();                           
       }catch (Exception e){
           
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
       }
       
       return pregunta;
    }

             /**
     * Obte la resposta correcta per a una pregunta d'una prova
     * @param Integer Identificador de prova
     * @param String Tipus de ronda
     * @param Integer Numero de pregunta
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */
    public String RespostaCorrecta(Integer pidProva, String TipusRonda, Integer numpregunta)  throws EOlympicsExceptionProva, EOlympicsException, SQLException{
       String pregunta= "";  
       
        String sql="SELECT OPCIOCORRECTA FROM RESPOSTACORRECTA "
                +  "WHERE  idProva = " + pidProva + " AND tipusronda = '" + TipusRonda 
                +  "' and numpregunta = " + numpregunta;
       
       try{
           Statement sentencia = gestor.creaSentencia();
           ResultSet rs = sentencia.executeQuery(sql);
            if (rs.next()) {
               pregunta = rs.getString(1);
            }
            rs.close();
            sentencia.close();
           
       }catch(SQLException sqle){
         
           throw new SQLException();                           
       }catch (Exception e){
           
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
       }
       
       return pregunta;
    }    
  
         /**
     * Guarda la resposta d'un estudiant per a una pregunta concreta
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @param String Tipus de ronda
     * @param Integer Numero de pregunta
     * @param String Resposta de pregunta
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */    
    public boolean EntrarPregunta(Integer pidProva, String TipusRonda, Integer pidEstudiant, Integer numpregunta, String resposta)  throws EOlympicsExceptionProva, EOlympicsException, SQLException{
        boolean confirmat=false;  
        
        String sql="INSERT INTO RESPOSTAESTUDIANT "
                + "(idProva,tipusronda,idestudiant,numpregunta,opciomarcada) "
                + "VALUES(?,?,?,?,?)";
                  
       try{
           PreparedStatement ps = gestor.crearPreparedStatement(sql);
       
           ps.setInt(1, pidProva);
           ps.setString(2, TipusRonda);
           ps.setInt(3,pidEstudiant); 
           ps.setInt(4,numpregunta); 
           ps.setString(5,resposta); 
           
           ps.execute();
           ps.close();                     

           confirmat = true;
           
       }catch(SQLException sqle){
         
           throw new SQLException();                           
       }catch (Exception e){
           
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
       }
        
        return confirmat;
    }

          /**
     * Esborrar un estudiant de la taula inscripcio
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */    
    public boolean esborrar(Integer pidProva, Integer pidEstudiant)  throws EOlympicsExceptionProva, EOlympicsException{
        boolean confirmat=false;  
        
        String sql="DELETE FROM INSCRIPCIO WHERE IDPROVA = ?"
                + " AND IDESTUDIANT = ? ";
        
       try{
           PreparedStatement ps = gestor.crearPreparedStatement(sql);
           ps.setInt(1, pidProva);
           ps.setInt(2, pidEstudiant);
           
           ps.execute();
           ps.close();                     
           
           confirmat=true;
       }catch(SQLException sqle){
         
           treatExceptionSQL(sqle.getMessage());                            
       }catch (Exception e){
           
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
       }
        
        return confirmat;
    }    

             /**
     * Comprova si un usuari està inscrit en una prova
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */ 
    public boolean ComprovaInscripcio(Integer pidProva,  Integer pidEstudiant)  throws EOlympicsExceptionProva, EOlympicsException{
        boolean participacio=false;  
        
        String sql="SELECT COUNT(*) FROM INSCRIPCIO "
                   + " WHERE idProva = " + pidProva 
                   + " AND idestudiant = " + pidEstudiant;
        
        Statement sentencia = gestor.creaSentencia();

        try {
            ResultSet rs = sentencia.executeQuery(sql);
            if (rs.next()) {
               if(rs.getInt(1) == 0){
                   participacio = false;
               } else {
                   participacio = true;
                 }
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        
        return participacio;
    }  

                 /**
     * Comprova si un usuari esta a la taula participacio
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @param String Tipus de ronda
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */ 
    public boolean ComprovaParticipacio(Integer pidProva, String TipusRonda, Integer pidEstudiant)  throws EOlympicsExceptionProva, EOlympicsException{
        boolean participacio=false;  
        
        String sql="SELECT COUNT(*) FROM PARTICIPACIO "
                   + " WHERE idProva = " + pidProva 
                   + " AND tipusronda = '" + TipusRonda
                   + "' AND idestudiant = " + pidEstudiant;
        
        Statement sentencia = gestor.creaSentencia();

        try {
            ResultSet rs = sentencia.executeQuery(sql);
            if (rs.next()) {
               if(rs.getInt(1) == 0){
                   participacio = false;
               } else {
                   participacio = true;
                 }
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        
        return participacio;
    }
    
                  /**
     * Comprova si un usuari ha participat en una prova
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @param String Tipus de ronda
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */    
    public boolean ComprovaRealitzacio(Integer pidProva, String TipusRonda, Integer pidEstudiant)  throws EOlympicsExceptionProva, EOlympicsException{
        boolean realitzacio=false;  
        
        String sql="SELECT COUNT(*) FROM RESPOSTAESTUDIANT "
                   + " WHERE idProva = " + pidProva 
                   + " AND tipusronda = '" + TipusRonda
                   + "' AND idestudiant = " + pidEstudiant;
        
        Statement sentencia = gestor.creaSentencia();

        try {
            ResultSet rs = sentencia.executeQuery(sql);
            if (rs.next()) {
               if(rs.getInt(1) == 0){
                   realitzacio = false;
               } else realitzacio = true;
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        
        return realitzacio;
    }

                     /**
     * Posem la data de la participacio a la taula participacio
     * @param Integer Identificador d'usuari
     * @param Integer Identificador de prova
     * @param String Tipus de ronda
     * @exception EOlympicsException
     * @exception EOlympicsExceptionProva
     */ 
    public boolean MarcaParticipacio(Integer pidProva, String TipusRonda, Integer pidEstudiant) throws SQLException, EOlympicsException {
        boolean fet = false;
        Date avui= new Date(System.currentTimeMillis());
        try{
            String sqlnota = "update participacio set dataparticipacio = ?"
                  + " WHERE idProva = ? AND tipusronda = ?  AND idestudiant = ?";
        
            PreparedStatement ps = gestor.crearPreparedStatement(sqlnota);
            ps.setDate(1, avui);
            ps.setInt(2, pidProva);
            ps.setString(3, TipusRonda);
            ps.setInt(4, pidEstudiant);
            ps.execute();
            ps.close();
            
        } catch(SQLException sqle){ 
           throw new SQLException();                           
        }catch (Exception e){
           System.out.println(e.getMessage());
           throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
       
        return fet;
    }
    
    /**
     * Llista de les proves on un Estudiant s'ha inscrit independentment del seu estat
     * @param pidEstudiant Identificador de l'Estudiant
     * @return Llista de les proves on l'estudiant s'ha inscrit independentment de l'estat
     * @exception EOlympicsException
     */
   public List<Prova> getProvesAmbInscripcio(Integer pidEstudiant) throws EOlympicsException{               
        String sql="SELECT P.idProva,P.descripcio,P.dataIniInscripcio,P.dataFiInscripcio,P.nombrePlaces,P.estat "  
                +  "FROM PROVA P WHERE P.IDPROVA IN "
                + "(SELECT IDPROVA FROM INSCRIPCIO WHERE IDESTUDIANT = " + pidEstudiant + ") ";

        return getProves(sql);
   }     

}
